import axios from 'axios'
import { useUserStore } from '@/stores'
import router from '@/router'

// 基地址
const baseURL = import.meta.env.VITE_BACKEND_BASE_URL

const instance = axios.create({
  baseURL, // 基地址
  timeout: 10000 // 超时时间
})

// 请求拦截器
instance.interceptors.request.use(
  (config) => {
    const userStore = useUserStore()
    if (userStore.token) {
      config.headers.token = userStore.token
    }
    return config
  },
  (err) => Promise.reject(err)
)

// 响应拦截器
instance.interceptors.response.use(
  async (res) => {
    if (res.data.code === 1) {
      return res
    } else if (res.config.responseType === 'blob') {
      if (res.headers['content-type'] !== 'application/json') {
        return res
      }
      const text = await res.data.text() // 将 Blob 转换为文本
      res.data = JSON.parse(text)
    }
    ElNotification({
      title: res.data.message || '服务异常',
      type: 'error'
    })
    return Promise.reject(res.data)
  },
  (err) => {
    if (!err.response) {
      ElNotification({
        title: '服务不可用，请检查网络连接或联系管理员',
        type: 'error'
      })
    } else if (err.code === 'ECONNABORTED' && err.message.includes('timeout')) {
      ElNotification({
        title: '请求超时，请稍后重试',
        type: 'error'
      })
    } else if (err.response?.status === 401) {
      const userStore = useUserStore()
      userStore.setUser({})
      userStore.setToken('')
      router.push('/login')
      ElNotification({
        title: '未授权，请重新登录',
        type: 'error'
      })
    } else {
      ElNotification({
        title: err.response.data.message || '服务异常',
        type: 'error'
      })
    }
    return Promise.reject(err)
  }
)

// 将网络图片地址转换为File对象
async function imageUrlToFile(imageUrl, filename) {
  try {
    // 使用Axios获取网络图片数据
    const response = await axios.get(imageUrl, { responseType: 'arraybuffer' })
    const imageData = response.data
    // 将图片数据转换成Blob对象
    const blob = new Blob([imageData], { type: response.headers['content-type'] })
    // 创建File对象
    const file = new File([blob], filename, { type: blob.type })
    return file
  } catch (error) {
    console.error('将图片转换为File对象时发生错误: ', error)
    throw error
  }
}

export default instance
export { baseURL, imageUrlToFile }
